(function ($) {
    $.fn.passwordStrength = function (settings) {
        settings = $.extend({}, $.fn.passwordStrength.defaults, settings);

        this.each(function () {
            var $this = $(this),
                scores = 0,
                checkingerror = false,
                pstrength = $(this).parents("form").find(".passwordStrength");

            $this.bind("keyup blur", function () {
                scores = $.fn.passwordStrength.ratepasswd($this.val(), settings);
                scores >= 0 && checkingerror == false && (checkingerror = true);

                pstrength.find("span").removeClass("bgStrength");
                if (scores < 35 && scores >= 0) {
                    pstrength.find("span:first").addClass("bgStrength");
                } else if (scores < 60 && scores >= 35) {
                    pstrength.find("span:lt(2)").addClass("bgStrength");
                } else if (scores >= 60) {
                    pstrength.find("span:lt(3)").addClass("bgStrength");
                }

                if (checkingerror && ($this.val().length < settings.minLen || $this.val().length > settings.maxLen)) {
                    settings.showmsg($this, $this.attr("errormsg"), 3);
                } else if (checkingerror) {
                    settings.showmsg($this, "", 2);
                }

                settings.trigger($this, !(scores >= 0));
            });
        });
    }

    $.fn.passwordStrength.ratepasswd = function (passwd, config) {
        //判断密码强度
        var len = passwd.length, scores;
        if (len >= config.minLen && len <= config.maxLen) {
            scores = $.fn.passwordStrength.checkStrong(passwd);
        } else {
            scores = -1;
        }

        return scores / 4 * 100;

    }

    //密码强度;
    $.fn.passwordStrength.checkStrong = function (content) {
        var modes = 0, len = content.length;
        for (var i = 0; i < len; i++) {
            modes |= $.fn.passwordStrength.charMode(content.charCodeAt(i));
        }
        return $.fn.passwordStrength.bitTotal(modes);
    }

    //字符类型;
    $.fn.passwordStrength.charMode = function (content) {
        if (content >= 48 && content <= 57) { // 0-9
            return 1;
        } else if (content >= 65 && content <= 90) { // A-Z
            return 2;
        } else if (content >= 97 && content <= 122) { // a-z
            return 4;
        } else { // 其它
            return 8;
        }
    }

    //计算出当前密码当中一共有多少种模式;
    $.fn.passwordStrength.bitTotal = function (num) {
        var modes = 0;
        for (var i = 0; i < 4; i++) {
            if (num & 1) {
                modes++;
            }
            num >>>= 1;
        }
        return modes;
    }

    $.fn.passwordStrength.defaults = {
        minLen: 0,
        maxLen: 30,
        trigger: $.noop
    }
})(jQuery);